// 智能排版服务 - 核心算法

/**
 * 主函数：一键排版
 * @param {string} content - 原始文章内容
 * @param {Array} images - 图片列表
 * @param {Object} template - 选择的模板
 * @returns {string} - 排版后的HTML
 */
export async function formatArticle(content, images, template) {
  // 1. 分析内容结构
  const analysis = analyzeContent(content)
  
  // 2. 智能分配图片
  const imageLayout = assignImages(analysis, images)
  
  // 3. 生成HTML
  const html = generateHTML(analysis, imageLayout, template)
  
  return html
}

/**
 * 分析文章内容结构
 * 识别：标签、标题、副标题、引言、小标题、段落等
 */
function analyzeContent(text) {
  const lines = text.split('\n').map(line => line.trim()).filter(line => line.length > 0)
  
  const result = {
    label: null,        // 【标签】
    mainTitle: null,    // 主标题
    subTitle: null,     // 副标题
    intro: null,        // 引言
    timePlace: null,    // 时间地点
    sections: []        // 各个章节
  }
  
  let currentSection = null
  let i = 0
  
  // 识别标签和标题（通常在前3行）
  while (i < Math.min(5, lines.length)) {
    const line = lines[i]
    
    // 识别标签：【xxx】
    if (!result.label && /^【[^】]+】/.test(line)) {
      const match = line.match(/^【([^】]+)】(.*)/)
      result.label = match[1]
      // 如果标签后面还有内容，可能是标题
      if (match[2].trim()) {
        result.mainTitle = match[2].trim()
      }
      i++
      continue
    }
    
    // 识别副标题：——开头
    if (!result.subTitle && line.startsWith('——')) {
      result.subTitle = line.substring(1).trim()
      i++
      continue
    }
    
    // 识别主标题（如果还没识别到）
    if (!result.mainTitle && line.length >= 6 && line.length <= 40) {
      result.mainTitle = line
      i++
      continue
    }
    
    break
  }
  
  // 识别引言（对偶句、短句）
  if (i < lines.length) {
    const line = lines[i]
    if (isIntro(line)) {
      result.intro = line
      i++
    }
  }
  
  // 识别时间地点
  if (i < lines.length) {
    const line = lines[i]
    if (isTimePlace(line)) {
      result.timePlace = line
      i++
    }
  }
  
  // 处理剩余内容
  while (i < lines.length) {
    const line = lines[i]
    
    // 识别小标题
    if (isSectionTitle(line)) {
      // 保存上一个section
      if (currentSection) {
        result.sections.push(currentSection)
      }
      // 创建新section
      currentSection = {
        title: line,
        paragraphs: []
      }
    } else {
      // 普通段落
      if (!currentSection) {
        // 如果还没有section，创建一个默认的
        currentSection = {
          title: null,
          paragraphs: []
        }
      }
      currentSection.paragraphs.push(line)
    }
    
    i++
  }
  
  // 保存最后一个section
  if (currentSection) {
    result.sections.push(currentSection)
  }
  
  return result
}

/**
 * 判断是否是引言（对偶句）
 */
function isIntro(line) {
  // 特征1: 包含分号或顿号，且长度适中
  if ((line.includes('；') || line.includes('、')) && line.length >= 10 && line.length <= 40) {
    return true
  }
  
  // 特征2: 包含逗号，四字一组
  if (line.includes('，')) {
    const parts = line.split('，')
    if (parts.length >= 2 && parts.every(p => p.length >= 4 && p.length <= 8)) {
      return true
    }
  }
  
  return false
}

/**
 * 判断是否是时间地点信息
 */
function isTimePlace(line) {
  // 包含年月日、时间、地点关键词
  const timeKeywords = ['年', '月', '日', '时', '分', '上午', '下午', '晚上']
  const placeKeywords = ['学校', '教室', '操场', '礼堂', '会议室', '场']
  
  const hasTime = timeKeywords.some(keyword => line.includes(keyword))
  const hasPlace = placeKeywords.some(keyword => line.includes(keyword))
  
  return (hasTime || hasPlace) && line.length >= 10 && line.length <= 100
}

/**
 * 判断是否是小标题
 */
function isSectionTitle(line) {
  // 特征1: 四字一组，逗号分隔（对偶句）
  if (/^[\u4e00-\u9fa5]{3,6}[，、][\u4e00-\u9fa5]{3,6}$/.test(line)) {
    return true
  }
  
  // 特征2: 短句（5-20字），不以句号结尾
  if (line.length >= 5 && line.length <= 20 && !line.endsWith('。') && !line.endsWith('！')) {
    // 排除一些明显是段落的情况
    if (!line.includes('，，') && !line.includes('、、')) {
      return true
    }
  }
  
  // 特征3: 纯四字格式
  if (/^[\u4e00-\u9fa5]{4}$/.test(line)) {
    return true
  }
  
  return false
}

/**
 * 智能分配图片到各个位置
 */
function assignImages(analysis, images) {
  if (!images || images.length === 0) {
    return {
      cover: null,
      sections: analysis.sections.map(() => null),
      ending: null
    }
  }
  
  const layout = {
    cover: null,
    sections: [],
    ending: null
  }
  
  // 第一张作为封面
  if (images.length >= 1) {
    layout.cover = images[0]
  }
  
  // 中间图片分配到各section
  let imgIndex = 1
  analysis.sections.forEach((section, index) => {
    if (imgIndex < images.length - 1) {
      layout.sections.push(images[imgIndex])
      imgIndex++
    } else {
      layout.sections.push(null)
    }
  })
  
  // 最后一张作为结尾图
  if (images.length >= 2) {
    layout.ending = images[images.length - 1]
  }
  
  return layout
}

/**
 * 生成HTML
 */
function generateHTML(analysis, imageLayout, template) {
  const styles = template.styles
  let html = ''
  
  // 容器开始
  html += `<div style="${styleToString(styles.global)}">\n`
  
  // 标签
  if (analysis.label) {
    html += `  <div style="${styleToString(styles.label)}">\n`
    html += `    【${analysis.label}】\n`
    html += `  </div>\n`
  }
  
  // 主标题
  if (analysis.mainTitle) {
    html += `  <h1 style="${styleToString(styles.mainTitle)}">\n`
    html += `    ${analysis.mainTitle}\n`
    html += `  </h1>\n`
  }
  
  // 副标题
  if (analysis.subTitle) {
    html += `  <h2 style="${styleToString(styles.subTitle)}">\n`
    html += `    ——${analysis.subTitle}\n`
    html += `  </h2>\n`
  }
  
  // 封面图
  if (imageLayout.cover) {
    html += `  <img src="${imageLayout.cover.url}" style="${styleToString(styles.coverImage || styles.image)}" />\n`
  }
  
  // 引言
  if (analysis.intro) {
    html += `  <div style="${styleToString(styles.intro)}">\n`
    html += `    ${analysis.intro}\n`
    html += `  </div>\n`
  }
  
  // 时间地点
  if (analysis.timePlace) {
    html += `  <p style="${styleToString(styles.timePlace || styles.paragraph)}">\n`
    html += `    ${analysis.timePlace}\n`
    html += `  </p>\n`
  }
  
  // 各个章节
  analysis.sections.forEach((section, index) => {
    // 小标题
    if (section.title) {
      html += `  <h3 style="${styleToString(styles.sectionTitle)}">\n`
      html += `    ${section.title}\n`
      html += `  </h3>\n`
    }
    
    // 段落
    section.paragraphs.forEach(paragraph => {
      html += `  <p style="${styleToString(styles.paragraph)}">\n`
      html += `    ${paragraph}\n`
      html += `  </p>\n`
    })
    
    // 章节配图
    if (imageLayout.sections[index]) {
      html += `  <img src="${imageLayout.sections[index].url}" style="${styleToString(styles.image)}" />\n`
    }
  })
  
  // 结尾图
  if (imageLayout.ending && imageLayout.ending !== imageLayout.cover) {
    html += `  <img src="${imageLayout.ending.url}" style="${styleToString(styles.image)}" />\n`
  }
  
  // 容器结束
  html += `</div>\n`
  
  return html
}

/**
 * 将样式对象转换为CSS字符串
 */
function styleToString(styleObj) {
  if (!styleObj) return ''
  
  return Object.entries(styleObj)
    .map(([key, value]) => {
      // 转换驼峰命名为CSS命名
      const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()
      
      // 处理数值（自动添加px单位）
      let cssValue = value
      if (typeof value === 'number' && !['fontWeight', 'lineHeight', 'opacity', 'zIndex'].includes(key)) {
        cssValue = `${value}px`
      }
      
      return `${cssKey}: ${cssValue}`
    })
    .join('; ')
}

export default {
  formatArticle,
  analyzeContent,
  assignImages,
  generateHTML
}

